"""
Definition: 抽象工厂模式（Abstract Factory Pattern）：是一种将工厂类进行抽象化的进一步改进，它使用了对象组合的方式来构建不同的产品族。
            （工厂抽象化，组合各种产品，类似工厂方法模式的不同类方法组合）
Scene: 抽象工厂模式可以同时创建多个不同的产品，且这些产品之间存在着一定的关联性。

Characters: 工厂角色（Factory） 具体工厂角色（Concrete Factory） 抽象产品角色（Product） 具体产品角色（Concrete Product） 客户端（Client）

Code: ProductA、ConcreteProductA1、ConcreteProductA2、ProductB、ConcreteProductB1 和 ConcreteProductB2 的定义与工厂方法模式的例子相同。
      不同之处在于，工厂类变成了一个抽象基类，并且增加了创建 ProductA 和 ProductB 对象的两个抽象方法。
"""


class ProductA:
    def use(self):
        pass


class ConcreteProductA1(ProductA):
    def use(self):
        print("Using product A1.")


class ConcreteProductA2(ProductA):
    def use(self):
        print("Using product A2.")


class ProductB:
    def operate(self):
        pass


class ConcreteProductB1(ProductB):
    def operate(self):
        print("Operating product B1.")


class ConcreteProductB2(ProductB):
    def operate(self):
        print("Operating product B2.")


class Factory:
    def create_product_a(self):
        pass

    def create_product_b(self):
        pass


class ConcreteFactory1(Factory):
    def create_product_a(self):
        return ConcreteProductA1()

    def create_product_b(self):
        return ConcreteProductB1()


class ConcreteFactory2(Factory):
    def create_product_a(self):
        return ConcreteProductA2()

    def create_product_b(self):
        return ConcreteProductB2()


factory_1 = ConcreteFactory1()
product_a1 = factory_1.create_product_a()
product_a1.use()  # 输出：Using product A1.
product_b1 = factory_1.create_product_b()
product_b1.operate()  # 输出：Operating product B1.

factory_2 = ConcreteFactory2()
product_a2 = factory_2.create_product_a()
product_a2.use()  # 输出：Using product A2.
product_b2 = factory_2.create_product_b()
product_b2.operate()  # 输出：Operating product B2.
